#pragma once
#include "BaseTask.h"
#include <string>
#include <cstdint>
#include <fstream>

// 前向声明
class TcpConnection;

/**
 * @brief 文件上传业务任务
 * 
 * 职责：
 * 1. 在业务线程池中执行文件上传逻辑
 * 2. 接收客户端上传的文件数据（支持分块传输）
 * 3. 保存文件到服务器本地目录
 * 4. 更新数据库中的文件路径（如头像字段）
 * 5. 返回上传结果给客户端
 * 
 * 使用场景：
 * - 用户上传头像
 * - 用户上传聊天图片
 * - 用户上传文档文件
 */
class FileUploadTask : public BaseTask
{
public:
    /**
     * @param conn TcpConnection 指针，用于发送响应
     * @param jsonBody 文件上传请求的 JSON 消息体
     */
    FileUploadTask(TcpConnection* conn, const std::string& jsonBody);
    
    ~FileUploadTask() override;
    
    /**
     * @brief 执行文件上传业务逻辑（在业务线程池中调用）
     * 处理 FILE_UPLOAD_REQ（初始化上传会话）
     * @param arg 预留参数，当前未使用
     */
    void work(void* arg) override;
    
    /**
     * @brief 静态方法：处理文件数据块
     * 处理 FILE_UPLOAD_DATA（接收文件数据块）
     * @param conn TcpConnection 指针
     * @param jsonBody 数据块 JSON
     * @return 是否处理成功
     */
    static bool handleFileChunk(TcpConnection* conn, const std::string& jsonBody);

private:
    /**
     * @brief 生成唯一的上传会话ID
     * @return 上传会话ID（UUID格式）
     */
    std::string generateUploadId();
    
    /**
     * @brief 验证文件类型是否允许上传
     * @param file_name 文件名
     * @param file_type 文件类型
     * @return 是否允许
     */
    bool validateFileType(const std::string& file_name, const std::string& file_type);
    
    /**
     * @brief 根据文件类型获取保存目录
     * @param file_type 文件类型（avatar/image/document等）
     * @return 保存目录路径
     */
    std::string getSaveDirectory(const std::string& file_type);
    
    /**
     * @brief 生成文件保存路径
     * @param file_type 文件类型
     * @param file_name 原始文件名
     * @param user_id 用户ID
     * @return 完整的保存路径
     */
    std::string generateFilePath(const std::string& file_type, 
                                 const std::string& file_name, 
                                 uint64_t user_id);
    
    /**
     * @brief Base64解码
     * @param encoded Base64编码的字符串
     * @return 解码后的二进制数据
     */
    static std::string base64Decode(const std::string& encoded);
    
    /**
     * @brief 保存文件数据块
     * @param upload_id 上传会话ID
     * @param chunk_data 数据块内容
     * @param is_last 是否为最后一块
     * @return 是否保存成功
     */
    bool saveFileChunk(const std::string& upload_id, 
                      const std::string& chunk_data, 
                      bool is_last);
    
    /**
     * @brief 更新数据库中的头像路径
     * @param user_id 用户ID
     * @param avatar_path 头像文件路径
     * @return 是否更新成功
     */
    bool updateUserAvatar(uint64_t user_id, const std::string& avatar_path);

private:
    TcpConnection* m_conn;      // TcpConnection 指针
    std::string m_jsonBody;     // 文件上传请求 JSON 数据
};

